//5位运动员参加了10米台跳水比赛，有人让他们预测比赛结果：
//
//
//
//A选手说：B第二，我第三；
//
//B选手说：我第二，E第四；
//
//C选手说：我第一，D第二；
//
//D选手说：C最后，我第三；
//
//E选手说：我第四，A第一；
//
//比赛结束后，每位选手都说对了一半，请编程确定比赛的名次。

#include <stdio.h>

//交换函数
void Exchange(int *a, int *b) {
    int tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;
}

void DiveRank(int *p, int n) {

    if (n >= 5) { //此时的n也是用来控制循环层数的
        if ((p[1] == 2) + (p[0] == 3) == 1 && //B第二，我第三
            (p[1] == 2) + (p[4] == 4) == 1 && //我第二，E第四
            (p[2] == 1) + (p[3] == 2) == 1 && //我第一，D第二
            (p[2] == 5) + (p[3] == 3) == 1 && //C最后，我第三
            (p[4] == 4) + (p[0] == 1) == 1)   //我第四，A第一
            //由于此时是执行的全排列，所以查重也省了。
        {
            for (int i = 0; i < 5; i++) {
                printf("%d ", p[i]);
            }
            putchar('\n');
        }
        return; //可以这样停止
    }

    for (int i = n; i < 5; i++) { //这个递归方式就完成了对1~5的全排列，方法是从后向前不停的执行交换。可以参考改进二和原代码，将这个递归程序写回成循环后，可以更好的理解。
        Exchange(p + i, p + n);
        DiveRank(p, n + 1);
        Exchange(p + i, p + n);
    }
}

int main() {
    int p[5] = {1, 2, 3, 4, 5}; //当然由于是全排列，所以初值必须给好。

    DiveRank(p, 0);

    return 0;
}